/*
 * Tracker.h
 */

#ifndef TRACKER_H_
#define TRACKER_H_

#include <map>
#include <set>
#include <vector>
#include <string>

namespace peermaliziosi {

using namespace std;

class Tracker {

private:

    /**
     * Serve per gestire correttamente il numero di seeder iniziali
     */
    int numSeeders;

    /**
     * Lista dei peer attivi (seeder compresi) e numero di pezzi mancanti per completare il file
     */
    map <int, int > activePeers;

    /**
     * seeders del torrent attualmente attivi, il primo posto e' occupato dal seeder iniziale del file
     */
    vector <int> seeders;

    /**
     * contiene l'indice di partenza da cui prelevare i seeder nel vettore "seeders" (per il load-balancing tra i seeder)
     */
    int seederStart;

    /**
     * ottieni una lista di peer da restituire a chi ha fatto la richiesta
     */
    set<int> * getPeerList(int peer, int numWanted);

public:

    Tracker();
    virtual ~Tracker();

    /**
     * un peer comunica al tracker che si e' verificato un determinato evento
     * remainingPieces e' il numero di pezzi che mancano al peer per completare il torrent
     * event puo' essere:
     * "completed" --> il peer ha completato il download del file (e' diventato seeder)
     * "started" --> il peer ha iniziato il download del file (e' appena entrato nello swarm)
     * "stopped" --> il peer ha fermato il download del file (e' uscito dallo swarm)
     * "regular" --> il peer chiede nuovi peer a cui effettuare l'handshake
     * numWanted sono il numero di peer richiesti (significativo solo se event e' "started" oppure "regular")
     * Restituisce un sottoinsieme di activePeers se event e' "started" oppure "regular"
     * altrimenti restituisce NULL
     *
     */
    set<int> * trackerRequest(int peer,int remainingPieces, string event, int numWanted);
    /**
     * restituisce true se il peer deve essere un seeder, false altrimenti
     * serve per inizializzare i seeder dello swarm
     */
    bool mustBeSeeder(int peer);

};

} /* namespace peermaliziosi */
#endif /* TRACKER_H_ */
